﻿
namespace SistemaLogistica.DataAccess
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class VehiculoData : BaseDataAccess
    {
        private VehiculoData() { }

        private readonly static VehiculoData instancia = new VehiculoData();

        public static VehiculoData Instancia
        {
            get { return instancia; }
        }

        public List<Vehiculo> Listar()
        {
            List<Vehiculo> vehiculos = new List<Vehiculo>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromVehiculo");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    Vehiculo vehiculo = new Vehiculo
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroPlaca = dr.GetString(dr.GetOrdinal("NroPlaca")),
                        TipoVehiculo = dr.GetInt32(dr.GetOrdinal("TipoVehiculo"))
                    };
                    vehiculos.Add(vehiculo);
                }
            }
            return vehiculos;
        }

        public List<Vehiculo> Buscar(string numero)
        {
            List<Vehiculo> vehiculos = new List<Vehiculo>();
            DbCommand command = db.GetStoredProcCommand("SearchVehiculo");
            db.AddInParameter(command, "numero", DbType.String, numero);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    Vehiculo vehiculo = new Vehiculo
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroPlaca = dr.GetString(dr.GetOrdinal("NroPlaca")),
                        TipoVehiculo = dr.GetInt32(dr.GetOrdinal("TipoVehiculo"))
                    };
                    vehiculos.Add(vehiculo);
                }
            }
            return vehiculos;
        }

        public List<VehiculoPropio> ListarPropios()
        {
            List<VehiculoPropio> vehiculos = new List<VehiculoPropio>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromVehiculoPropio");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Vehiculo vehiculo = ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    VehiculoPropio vehiculoPropio = new VehiculoPropio
                    {
                        Estado = vehiculo.Estado,
                        Nombre = vehiculo.Nombre,
                        Precio = vehiculo.Precio,
                        StockActual = vehiculo.StockActual,
                        StockMinimo = vehiculo.StockMinimo,
                        Descripcion = vehiculo.Descripcion,
                        UnidadMedidia = vehiculo.UnidadMedidia,
                        Marca = vehiculo.Marca,
                        Modelo = vehiculo.Modelo,
                        NroPlaca = vehiculo.NroPlaca,
                        TipoVehiculo = vehiculo.TipoVehiculo,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        FechaCompra = dr.GetDateTime(dr.GetOrdinal("FechaCompra")),
                        IdVehiculoPropio = dr.GetInt32(dr.GetOrdinal("IdVehiculoPropio")),
                        TarjetaPropiedad = dr.GetString(dr.GetOrdinal("TarjetaPropiedad"))
                    };
                    vehiculos.Add(vehiculoPropio);
                }
            }
            return vehiculos;
        }

        public List<VehiculoAlquilado> ListarAlquilados()
        {
            List<VehiculoAlquilado> vehiculos = new List<VehiculoAlquilado>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromVehiculoAlquilado");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Vehiculo vehiculo = ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    VehiculoAlquilado vehiculoAlquilado = new VehiculoAlquilado
                    {
                        Estado = vehiculo.Estado,
                        Nombre = vehiculo.Nombre,
                        Precio = vehiculo.Precio,
                        StockActual = vehiculo.StockActual,
                        StockMinimo = vehiculo.StockMinimo,
                        Descripcion = vehiculo.Descripcion,
                        UnidadMedidia = vehiculo.UnidadMedidia,
                        Marca = vehiculo.Marca,
                        Modelo = vehiculo.Modelo,
                        NroPlaca = vehiculo.NroPlaca,
                        TipoVehiculo = vehiculo.TipoVehiculo,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Contrato = dr.GetString(dr.GetOrdinal("Contrato")),
                        IdVehiculoAlquilado = dr.GetInt32(dr.GetOrdinal("IdVehiculoAlquilado")),
                        MontoPago = dr.GetDecimal(dr.GetOrdinal("MontoPago"))
                    };
                    vehiculos.Add(vehiculoAlquilado);
                }
            }
            return vehiculos;
        }

        public List<VehiculoPropio> BuscarPropio(string nroPlaca)
        {
            List<VehiculoPropio> vehiculos = new List<VehiculoPropio>();
            DbCommand command = db.GetStoredProcCommand("SearchVehiculoPropio");
            db.AddInParameter(command, "nroPlaca", DbType.String, nroPlaca);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Vehiculo vehiculo = ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    VehiculoPropio vehiculoPropio = new VehiculoPropio
                    {
                        Estado = vehiculo.Estado,
                        Nombre = vehiculo.Nombre,
                        Precio = vehiculo.Precio,
                        StockActual = vehiculo.StockActual,
                        StockMinimo = vehiculo.StockMinimo,
                        Descripcion = vehiculo.Descripcion,
                        UnidadMedidia = vehiculo.UnidadMedidia,
                        Marca = vehiculo.Marca,
                        Modelo = vehiculo.Modelo,
                        NroPlaca = vehiculo.NroPlaca,
                        TipoVehiculo = vehiculo.TipoVehiculo,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        FechaCompra = dr.GetDateTime(dr.GetOrdinal("FechaCompra")),
                        IdVehiculoPropio = dr.GetInt32(dr.GetOrdinal("IdVehiculoPropio")),
                        TarjetaPropiedad = dr.GetString(dr.GetOrdinal("TarjetaPropiedad"))
                    };
                    vehiculos.Add(vehiculoPropio);
                }
            }
            return vehiculos;
        }

        public List<VehiculoAlquilado> BuscarAlquilado(string nroPlaca)
        {
            List<VehiculoAlquilado> vehiculos = new List<VehiculoAlquilado>();
            DbCommand command = db.GetStoredProcCommand("SearchVehiculoAlquilado");
            db.AddInParameter(command, "nroPlaca", DbType.String, nroPlaca);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Vehiculo vehiculo = ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    VehiculoAlquilado vehiculoAlquilado = new VehiculoAlquilado
                    {
                        Estado = vehiculo.Estado,
                        Nombre = vehiculo.Nombre,
                        Precio = vehiculo.Precio,
                        StockActual = vehiculo.StockActual,
                        StockMinimo = vehiculo.StockMinimo,
                        Descripcion = vehiculo.Descripcion,
                        UnidadMedidia = vehiculo.UnidadMedidia,
                        Marca = vehiculo.Marca,
                        Modelo = vehiculo.Modelo,
                        NroPlaca = vehiculo.NroPlaca,
                        TipoVehiculo = vehiculo.TipoVehiculo,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Contrato = dr.GetString(dr.GetOrdinal("Contrato")),
                        IdVehiculoAlquilado = dr.GetInt32(dr.GetOrdinal("IdVehiculoAlquilado")),
                        MontoPago = dr.GetDecimal(dr.GetOrdinal("MontoPago"))
                    };
                    vehiculos.Add(vehiculoAlquilado);
                }
            }
            return vehiculos;
        }

        public VehiculoAlquilado BuscarAlquiladoFull(string descripcion)
        {
            VehiculoAlquilado vehiculoAlquilado = null;
            DbCommand command = db.GetStoredProcCommand("SearchVehiculoAlquiladoFull");
            db.AddInParameter(command, "descripcion", DbType.String, descripcion);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Vehiculo vehiculo = ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    vehiculoAlquilado = new VehiculoAlquilado
                    {
                        Estado = vehiculo.Estado,
                        Nombre = vehiculo.Nombre,
                        Precio = vehiculo.Precio,
                        StockActual = vehiculo.StockActual,
                        StockMinimo = vehiculo.StockMinimo,
                        Descripcion = vehiculo.Descripcion,
                        UnidadMedidia = vehiculo.UnidadMedidia,
                        Marca = vehiculo.Marca,
                        Modelo = vehiculo.Modelo,
                        NroPlaca = vehiculo.NroPlaca,
                        TipoVehiculo = vehiculo.TipoVehiculo,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Contrato = dr.GetString(dr.GetOrdinal("Contrato")),
                        IdVehiculoAlquilado = dr.GetInt32(dr.GetOrdinal("IdVehiculoAlquilado")),
                        MontoPago = dr.GetDecimal(dr.GetOrdinal("MontoPago"))
                    };
                }
            }
            return vehiculoAlquilado;
        }

        public VehiculoAlquilado ObtenerAlquilado(int idVehiculoAlquilado)
        {
            VehiculoAlquilado vehiculoAlquilado = null;
            DbCommand command = db.GetStoredProcCommand("GetVehiculoalquiladoByID");
            db.AddInParameter(command, "idVehiculoAlquilado", DbType.Int32, idVehiculoAlquilado);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Vehiculo vehiculo = ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    vehiculoAlquilado = new VehiculoAlquilado
                    {
                        Estado = vehiculo.Estado,
                        Nombre = vehiculo.Nombre,
                        Precio = vehiculo.Precio,
                        StockActual = vehiculo.StockActual,
                        StockMinimo = vehiculo.StockMinimo,
                        Descripcion = vehiculo.Descripcion,
                        UnidadMedidia = vehiculo.UnidadMedidia,
                        Marca = vehiculo.Marca,
                        Modelo = vehiculo.Modelo,
                        NroPlaca = vehiculo.NroPlaca,
                        TipoVehiculo = vehiculo.TipoVehiculo,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Contrato = dr.GetString(dr.GetOrdinal("Contrato")),
                        IdVehiculoAlquilado = dr.GetInt32(dr.GetOrdinal("IdVehiculoAlquilado")),
                        MontoPago = dr.GetDecimal(dr.GetOrdinal("MontoPago"))
                    };
                }
            }
            return vehiculoAlquilado;
        }

        public Vehiculo ObtenerPorID(int idBien)
        {
            Vehiculo vehiculo = null;
            DbCommand command = db.GetStoredProcCommand("GetVehiculoByIdBien");
            db.AddInParameter(command, "idBien", DbType.Int32, idBien);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    vehiculo = new Vehiculo
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroPlaca = dr.GetString(dr.GetOrdinal("NroPlaca")),
                        TipoVehiculo = dr.GetInt32(dr.GetOrdinal("TipoVehiculo"))
                    };
                }
            }
            return vehiculo;
        }

        public Vehiculo ObtenerPorNroPlaca(string nroPlaca)
        {
            Vehiculo vehiculo = null;
            DbCommand command = db.GetStoredProcCommand("GetVehiculoByNroPlaca");
            db.AddInParameter(command, "nroPlaca", DbType.String, nroPlaca);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    vehiculo = new Vehiculo
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroPlaca = dr.GetString(dr.GetOrdinal("NroPlaca")),
                        TipoVehiculo = dr.GetInt32(dr.GetOrdinal("TipoVehiculo"))
                    };
                }
            }
            return vehiculo;
        }

        public Vehiculo ObtenerPorDescripcion(string descripcion)
        {
            Vehiculo vehiculo = null;
            DbCommand command = db.GetStoredProcCommand("GetVehiculoByDescripcion");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    vehiculo = new Vehiculo
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroPlaca = dr.GetString(dr.GetOrdinal("NroPlaca")),
                        TipoVehiculo = dr.GetInt32(dr.GetOrdinal("TipoVehiculo"))
                    };
                }
            }
            return vehiculo;
        }

        public void AgregarPropio(VehiculoPropio vp)
        {
            using (DbConnection conection = db.CreateConnection())
            {
                conection.Open();
                using (DbTransaction transaction = conection.BeginTransaction())
                {
                    try
                    {
                        UnidadMedidia unidad = UnidadMedidiaData.Instancia.ObtenerMedidaBase();

                        DbCommand cmdBien = db.GetStoredProcCommand("InsertBien");
                        db.AddInParameter(cmdBien, "descripcion", DbType.String, vp.Descripcion);
                        db.AddInParameter(cmdBien, "estado", DbType.Int32, vp.Estado);
                        db.AddInParameter(cmdBien, "stockActual", DbType.Decimal, vp.StockActual);
                        db.AddInParameter(cmdBien, "stockMinimo", DbType.Decimal, vp.StockMinimo);
                        db.AddInParameter(cmdBien, "idUnidadMedida", DbType.Int32, unidad.IdUnidadMedida);
                        db.AddOutParameter(cmdBien, "idBien", DbType.Int32, 11);
                        db.AddInParameter(cmdBien, "nombre", DbType.String, vp.Nombre);
                        db.AddInParameter(cmdBien, "precio", DbType.Currency, vp.Precio);

                        int result = db.ExecuteNonQuery(cmdBien, transaction);
                        if (result == 0) throw new Exception();

                        int idBien = Convert.ToInt32(db.GetParameterValue(cmdBien, "IdBien"));

                        DbCommand cmbVehiculo = db.GetStoredProcCommand("InsertVehiculo");
                        db.AddInParameter(cmbVehiculo, "idBien", DbType.Int32, idBien);
                        db.AddInParameter(cmbVehiculo, "marca", DbType.String, vp.Marca);
                        db.AddInParameter(cmbVehiculo, "modelo", DbType.String, vp.Modelo);
                        db.AddInParameter(cmbVehiculo, "nroPlaca", DbType.String, vp.NroPlaca);
                        db.AddInParameter(cmbVehiculo, "tipoVehiculo", DbType.Int32, vp.TipoVehiculo);

                        result = db.ExecuteNonQuery(cmbVehiculo, transaction);
                        if (result == 0) throw new Exception();

                        DbCommand cmbVehiculoPropio = db.GetStoredProcCommand("InsertVehiculoPropio");
                        db.AddInParameter(cmbVehiculoPropio, "fechaCompra", DbType.DateTime, vp.FechaCompra);
                        db.AddInParameter(cmbVehiculoPropio, "idBien", DbType.Int32, idBien);
                        db.AddOutParameter(cmbVehiculoPropio, "idVehiculoPropio", DbType.Int32, 11);
                        db.AddInParameter(cmbVehiculoPropio, "precio", DbType.Decimal, vp.Precio);
                        db.AddInParameter(cmbVehiculoPropio, "tarjetaPropiedad", DbType.String, vp.TarjetaPropiedad);

                        result = db.ExecuteNonQuery(cmbVehiculoPropio, transaction);
                        if (result == 0) throw new Exception();

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                }
            }
        }

        public void AgregarAquilado(VehiculoAlquilado va)
        {
            using (DbConnection conection = db.CreateConnection())
            {
                conection.Open();
                using (DbTransaction transaction = conection.BeginTransaction())
                {
                    try
                    {
                        UnidadMedidia unidad = UnidadMedidiaData.Instancia.ObtenerMedidaBase();

                        DbCommand cmdBien = db.GetStoredProcCommand("InsertBien");
                        db.AddInParameter(cmdBien, "descripcion", DbType.String, va.Descripcion);
                        db.AddInParameter(cmdBien, "estado", DbType.Int32, va.Estado);
                        db.AddInParameter(cmdBien, "stockActual", DbType.Decimal, va.StockActual);
                        db.AddInParameter(cmdBien, "stockMinimo", DbType.Decimal, va.StockMinimo);
                        db.AddInParameter(cmdBien, "idUnidadMedida", DbType.Int32, unidad.IdUnidadMedida);
                        db.AddOutParameter(cmdBien, "idBien", DbType.Int32, 11);
                        db.AddInParameter(cmdBien, "nombre", DbType.String, va.Nombre);
                        db.AddInParameter(cmdBien, "precio", DbType.Currency, va.Precio);

                        int result = db.ExecuteNonQuery(cmdBien, transaction);
                        if (result == 0) throw new Exception();

                        int idBien = Convert.ToInt32(db.GetParameterValue(cmdBien, "IdBien"));

                        DbCommand cmbVehiculo = db.GetStoredProcCommand("InsertVehiculo");
                        db.AddInParameter(cmbVehiculo, "idBien", DbType.Int32, idBien);
                        db.AddInParameter(cmbVehiculo, "marca", DbType.String, va.Marca);
                        db.AddInParameter(cmbVehiculo, "modelo", DbType.String, va.Modelo);
                        db.AddInParameter(cmbVehiculo, "nroPlaca", DbType.String, va.NroPlaca);
                        db.AddInParameter(cmbVehiculo, "tipoVehiculo", DbType.Int32, va.TipoVehiculo);

                        result = db.ExecuteNonQuery(cmbVehiculo, transaction);
                        if (result == 0) throw new Exception();

                        DbCommand cmbVehiculoAlquilado = db.GetStoredProcCommand("InsertVehiculoAlquilado");
                        db.AddInParameter(cmbVehiculoAlquilado, "contrato", DbType.String, va.Contrato);
                        db.AddInParameter(cmbVehiculoAlquilado, "idBien", DbType.Int32, idBien);
                        db.AddOutParameter(cmbVehiculoAlquilado, "idVehiculoAlquilado", DbType.Int32, 11);
                        db.AddInParameter(cmbVehiculoAlquilado, "montoPago", DbType.Decimal, va.MontoPago);

                        result = db.ExecuteNonQuery(cmbVehiculoAlquilado, transaction);
                        if (result == 0) throw new Exception();

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                }
            }
        }

        public void ModificarPropio(VehiculoPropio vp)
        {
            using (DbConnection conection = db.CreateConnection())
            {
                conection.Open();
                using (DbTransaction transaction = conection.BeginTransaction())
                {
                    try
                    {
                        UnidadMedidia unidad = UnidadMedidiaData.Instancia.ObtenerMedidaBase();

                        DbCommand cmdBien = db.GetStoredProcCommand("UpdateBien");
                        db.AddInParameter(cmdBien, "descripcion", DbType.String, vp.Descripcion);
                        db.AddInParameter(cmdBien, "estado", DbType.Int32, vp.Estado);
                        db.AddInParameter(cmdBien, "stockActual", DbType.Decimal, vp.StockActual);
                        db.AddInParameter(cmdBien, "stockMinimo", DbType.Decimal, vp.StockMinimo);
                        db.AddInParameter(cmdBien, "idUnidadMedida", DbType.Int32, unidad.IdUnidadMedida);
                        db.AddInParameter(cmdBien, "idBien", DbType.Int32, vp.IdBien);
                        db.AddInParameter(cmdBien, "nombre", DbType.String, vp.Nombre);
                        db.AddInParameter(cmdBien, "precio", DbType.Currency, vp.Precio);

                        int result = db.ExecuteNonQuery(cmdBien, transaction);
                        if (result == 0) throw new Exception();

                        DbCommand cmbVehiculo = db.GetStoredProcCommand("UpdateVehiculo");
                        db.AddInParameter(cmbVehiculo, "idBien", DbType.Int32, vp.IdBien);
                        db.AddInParameter(cmbVehiculo, "marca", DbType.String, vp.Marca);
                        db.AddInParameter(cmbVehiculo, "modelo", DbType.String, vp.Modelo);
                        db.AddInParameter(cmbVehiculo, "nroPlaca", DbType.String, vp.NroPlaca);
                        db.AddInParameter(cmbVehiculo, "tipoVehiculo", DbType.Int32, vp.TipoVehiculo);

                        result = db.ExecuteNonQuery(cmbVehiculo, transaction);
                        if (result == 0) throw new Exception();

                        DbCommand cmbVehiculoPropio = db.GetStoredProcCommand("UpdateVehiculoPropio");
                        db.AddInParameter(cmbVehiculoPropio, "fechaCompra", DbType.DateTime, vp.FechaCompra);
                        db.AddInParameter(cmbVehiculoPropio, "idBien", DbType.Int32, vp.IdBien);
                        db.AddInParameter(cmbVehiculoPropio, "idVehiculoPropio", DbType.Int32, vp.IdVehiculoPropio);
                        db.AddInParameter(cmbVehiculoPropio, "precio", DbType.Decimal, vp.Precio);
                        db.AddInParameter(cmbVehiculoPropio, "tarjetaPropiedad", DbType.String, vp.TarjetaPropiedad);

                        result = db.ExecuteNonQuery(cmbVehiculoPropio, transaction);
                        if (result == 0) throw new Exception();

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                }
            }
        }

        public void ModificarAlquilado(VehiculoAlquilado va)
        {
            using (DbConnection conection = db.CreateConnection())
            {
                conection.Open();
                using (DbTransaction transaction = conection.BeginTransaction())
                {
                    try
                    {
                        UnidadMedidia unidad = UnidadMedidiaData.Instancia.ObtenerMedidaBase();

                        DbCommand cmdBien = db.GetStoredProcCommand("UpdateBien");
                        db.AddInParameter(cmdBien, "descripcion", DbType.String, va.Descripcion);
                        db.AddInParameter(cmdBien, "estado", DbType.Int32, va.Estado);
                        db.AddInParameter(cmdBien, "stockActual", DbType.Decimal, va.StockActual);
                        db.AddInParameter(cmdBien, "stockMinimo", DbType.Decimal, va.StockMinimo);
                        db.AddInParameter(cmdBien, "idUnidadMedida", DbType.Int32, unidad.IdUnidadMedida);
                        db.AddInParameter(cmdBien, "idBien", DbType.Int32, va.IdBien);
                        db.AddInParameter(cmdBien, "nombre", DbType.String, va.Nombre);
                        db.AddInParameter(cmdBien, "precio", DbType.Currency, va.Precio);

                        int result = db.ExecuteNonQuery(cmdBien, transaction);
                        if (result == 0) throw new Exception();

                        DbCommand cmbVehiculo = db.GetStoredProcCommand("UpdateVehiculo");
                        db.AddInParameter(cmbVehiculo, "idBien", DbType.Int32, va.IdBien);
                        db.AddInParameter(cmbVehiculo, "marca", DbType.String, va.Marca);
                        db.AddInParameter(cmbVehiculo, "modelo", DbType.String, va.Modelo);
                        db.AddInParameter(cmbVehiculo, "nroPlaca", DbType.String, va.NroPlaca);
                        db.AddInParameter(cmbVehiculo, "tipoVehiculo", DbType.Int32, va.TipoVehiculo);

                        result = db.ExecuteNonQuery(cmbVehiculo, transaction);
                        if (result == 0) throw new Exception();

                        DbCommand cmbVehiculoAlquilado = db.GetStoredProcCommand("UpdateVehiculoAlquilado");
                        db.AddInParameter(cmbVehiculoAlquilado, "contrato", DbType.String, va.Contrato);
                        db.AddInParameter(cmbVehiculoAlquilado, "idBien", DbType.Int32, va.IdBien);
                        db.AddInParameter(cmbVehiculoAlquilado, "idVehiculoAlquilado", DbType.Int32, va.IdVehiculoAlquilado);
                        db.AddInParameter(cmbVehiculoAlquilado, "montoPago", DbType.Decimal, va.MontoPago);

                        result = db.ExecuteNonQuery(cmbVehiculoAlquilado, transaction);
                        if (result == 0) throw new Exception();

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                }
            }
        }

        public void Eliminar(int idVehiculo)
        {
            DbCommand command = db.GetStoredProcCommand("DeleteVehiculo");
            db.AddInParameter(command, "idBien", DbType.Int32, idVehiculo);
            db.ExecuteNonQuery(command);
        }
    }
}
